package cn.demoncat.util.lang.entity.report;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.annotation.JSONField;

/**
 * 报表数据 - 双维度 - 分类:统计,金额
 * 
 * {category,value,legend[countTitle,sumTitle]}
 * 
 * @author 延晓磊
 *
 * @since 2020年7月9日
 */
public class ReportDataItemCountSum extends ReportDataItem{

	/**
	 * 维度说明
	 * 
	 * 值：[countTitle,sumTitle]
	 */
	private List<String> legend = new ArrayList<>();
	
	/**
	 * 数据
	 * 
	 * 值：{countTitle:[count],sumTitle:[sum]}
	 */
	private Map<String, List<Object>> value = new LinkedHashMap<>();

	/**
	 * 数据长度
	 * 
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年7月14日
	 */
	public int size() {
		return this.value.get(legend.get(0)).size();
	}
	
	/**
	 * 构建
	 * 
	 * @param countTitle	总计标题
	 * @param sumTitle		总额标题
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年7月13日
	 */
	public static ReportDataItemCountSum build(String countTitle, String sumTitle) {
		ReportDataItemCountSum count = new ReportDataItemCountSum();
		// 维度说明
		count.legend.add(countTitle);
		count.legend.add(sumTitle);
		// 维度数据
		count.value.put(countTitle, new ArrayList<>());
		count.value.put(sumTitle, new ArrayList<>());
		return count;
	}
	
	/**
	 * 构建
	 * 
	 * @param countTitle	总计标题
	 * @param sumTitle		总额标题
	 * @param datas			数据{id,count,sum}
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年7月13日
	 */
	public static ReportDataItemCountSum build(String countTitle, String sumTitle, List<SidCount> datas) {
		// 构建图表
		ReportDataItemCountSum count = build(countTitle, sumTitle);
		// 添加数据
		datas.forEach(item -> count.add(item.getId(), item.getCount(), item.getSum()));
		return count;
	}
	
	/**
	 * 添加数据
	 * 
	 * @param category	分类
	 * @param count		总数
	 * @param sum		总额
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年7月13日
	 */
	public ReportDataItemCountSum add(String category, Long count, BigDecimal sum) {
		this.addCategory(category);
		return add(count, sum);
	}
	
	/**
	 * 添加数据
	 * 
	 * @param count		总数
	 * @param sum		总额
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年7月13日
	 */
	public ReportDataItemCountSum add(Long count, BigDecimal sum) {
		this.value.get(this.legend.get(0)).add(count);
		this.value.get(this.legend.get(1)).add(sum);
		return this;
	}
	
	/**
	 * 设置数据
	 * 
	 * @param i			索引
	 * @param count		总数
	 * @param sum		总额
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年7月13日
	 */
	public ReportDataItemCountSum add(int i, Long count, BigDecimal sum) {
		this.value.get(this.legend.get(0)).set(i, count);
		this.value.get(this.legend.get(1)).set(i, sum);
		return this;
	}
	
	/**
	 * 维度
	 * 
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年7月9日
	 */
	public List<String> getLegend() {
		return legend;
	}

	/**
	 * 维度
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年7月9日
	 */
	public void setLegend(List<String> legend) {
		this.legend = legend;
	}
	
	/**
	 * 数据
	 * 
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年7月9日
	 */
	public Map<String, List<Object>> getValue() {
		return value;
	}

	/**
	 * 数据
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年7月9日
	 */
	public void setValue(Map<String, List<Object>> value) {
		this.value = value;
	}
	
	/**
	 * 获取Count数据
	 * 
	 * @param i
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年7月9日
	 */
	@JSONField(serialize=false,deserialize=false)
	public Long getCount(int i){
		return (Long)(value.get(legend.get(0)).get(i));
	}
	
	/**
	 * 获取Sum数据
	 * 
	 * @param i
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年7月9日
	 */
	@JSONField(serialize=false,deserialize=false)
	public BigDecimal getSum(int i){
		return (BigDecimal)(value.get(legend.get(1)).get(i));
	}
}
